package controller;

import java.io.IOException;
import java.sql.SQLException;
import java.util.GregorianCalendar;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import model.Benutzer;
import model.Ebene;
import model.Feld;
import model.Gruppe;


/**
 * Dieses Servlet dient Redakteuren, Dezernat2 und Modulverantwortlichen zum Bearbeiten und zum Prüfen des Inhalts einer Organisationsebene.
 */
@WebServlet({"/OrgaBearbeitenForm", "/orgabearbeitenform", "/OrgaBearbeitenForm.html", "/orgabearbeitenform.html", "/Bearbeiten", "/bearbeiten", "/Bearbeiten.html", "/bearbeiten.html", "/OrgaBearbeitenPruefenForm", "/orgabearbeitenpruefenform", "/OrgaBearbeitenPruefenForm.html", "/orgabearbeitenpruefenform.html", "/BearbeitenPruefen", "/bearbeitenpruefen", "/BearbeitenPruefen.html", "/bearbeitenpruefen.html"})
public class OrgaBearbeitenForm extends SessionControll {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public OrgaBearbeitenForm() {
        super();
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("UTF-8");
		if(loginPruefen(request, response)) {
			Ebene e = null;
			// Ebene nach ID und Version holen holen
			if(request.getParameter("ebenenId") != null) {
				if(!request.getParameter("ebenenId").equals("")) {
					try {
						e = ebenenRepository.getNeusteEbeneNachId(Integer.parseInt(request.getParameter("ebenenId")));
					} catch(NumberFormatException exc) {
						response.sendRedirect("Fehler?weiterleitung=Bearbeiten&fehler=Es gab einen Formatfehler! Bitte versuchen Sie es erneut oder kontaktieren Sie einen Administrator. (F091)");
					}
				}
			}
			// Rechte prüfen
			try {
				if(e != null) {
					boolean verantwortlich=false, grpVerantwortlich=false, redakteur=false, grpRedakteur=false, grpDez2=false;
					// Prüfen ob in Gruppe
					int userID = getAktuellerBenutzer(request, response).getId();
					grpVerantwortlich = gruppenRepository.getGruppeNachId(Gruppe.ORDNUNGSEBENENVERANTWORTLICHER).inGruppe(userID);
					grpRedakteur = gruppenRepository.getGruppeNachId(Gruppe.REDAKTEUR).inGruppe(userID);
					grpDez2 = gruppenRepository.getGruppeNachId(Gruppe.DEZERNAT2).inGruppe(userID);
					if(grpVerantwortlich || grpRedakteur || grpDez2) {
						Benutzer[] benutzer = e.getVerantwortlich();
						// Prüfen ob Verantwortlicher der Ebene
						if(benutzer != null) {
							for(int i=0; i<benutzer.length; i++) {
								if(benutzer[i] == getAktuellerBenutzer(request, response)) {
									verantwortlich = true;
									break;
								}
							}
						}
						benutzer = e.getRedakteur();
						if(benutzer != null) {
							for(int i=0; i<benutzer.length; i++) {
								if(benutzer[i] == getAktuellerBenutzer(request, response)) {
									redakteur = true;
									break;
								}
							}
						}
						if(verantwortlich || redakteur || grpDez2) { // Anzeigen / Ändern
							if(request.getParameter("speichern") != null || request.getParameter("speichernundabschl") != null) { // Ändern
								long time = (new GregorianCalendar()).getTimeInMillis();
								// prüfen ob etwas geändert wurde
								boolean changed = false;
								if(e.getProsa() != null) {
									if(!e.getProsa().getWert().equals(request.getParameter("prosa"))) {
										System.out.println("BearbeitenPruefen: changed!!");
										System.out.println("-----------------------------");
										System.out.println("Prosa");
										System.out.println(e.getProsa().getWert());
										System.out.println("ProsaNeu");
										System.out.println(request.getParameter("prosa"));
										System.out.println("-----------------------------");
										changed = true;
									}
								}
								if(!changed) {
									if(e.getFeld() != null) {
										Feld[] f = e.getFeld();
										for(int i=0; i<e.getFeld().length; i++) {
											if(!f[i].getWert().equals( request.getParameter("feld"+f[i].getId()) )) {
												System.out.println("BearbeitenPruefen: changed!!");
												System.out.println("-----------------------------");
												System.out.println("Feld:"+f[i].getId());
												System.out.println(f[i].getWert());
												System.out.println("Feld:"+f[i].getId()+"Neu");
												System.out.println(request.getParameter("feld"+f[i].getId()));
												System.out.println("-----------------------------");
												changed = true;
												break;
											}
										}
									}
								}
								// Änderungen speichern
								int alterRedkZustand = e.getRedaktionszustand();
								if(changed) {
									// neue Prosa speichern
									Feld prosaNeu=null;
									if(e.getProsa()!=null) {
										prosaNeu = new Feld(e.getProsa().getId(),
															e.getProsa().getTyp(),
															e.getProsa().getName(),
															e.getProsa().isDez2relevant(),
															time,
															request.getParameter("prosa"));
										felderRepository.saveFeld(prosaNeu);
									}
									// neue Felder speichern
									Feld[] felderNeu=null, felderAlt;
									felderAlt = e.getFeld();
									if(felderAlt != null) {
										felderNeu = new Feld[felderAlt.length];
										for(int i=0; i<felderNeu.length; i++) {
											felderNeu[i] = new Feld(felderAlt[i].getId(),
																	felderAlt[i].getTyp(),
																	felderAlt[i].getName(),
																	felderAlt[i].isDez2relevant(),
																	time,
																	request.getParameter("feld"+felderAlt[i].getId()));
											felderRepository.saveFeld(felderNeu[i]);
										}
									}
									// Arrays zu idStrings
									String idsRed="", idsVer="", idsFeld="", idsUnter="";
									if(felderNeu!=null) {
										for(int i=0; i<felderNeu.length; i++) {
											idsFeld += felderNeu[i].getId() + ";";
										}
										if(idsFeld.endsWith(";")) {
											idsFeld = idsFeld.substring(0, idsFeld.length()-1);
										}
									}
									if(e.getUnterelement()!=null) {
										for(int i=0; i<e.getUnterelement().length; i++) {
											idsUnter += e.getUnterelement()[i].getId() + ";";
										}
										if(idsUnter.endsWith(";")) {
											idsUnter = idsUnter.substring(0, idsUnter.length()-1);
										}
									}
									if(e.getVerantwortlich()!=null) {
										for(int i=0; i<e.getVerantwortlich().length; i++) {
											idsVer += e.getVerantwortlich()[i].getId() + ";";
										}
										if(idsVer.endsWith(";")) {
											idsVer= idsVer.substring(0, idsVer.length()-1);
										}
									}
									if(e.getRedakteur()!=null) {
										for(int i=0; i<e.getRedakteur().length; i++) {
											idsRed += e.getRedakteur()[i].getId() + ";";
										}
										if(idsRed.endsWith(";")) {
											idsRed = idsRed.substring(0, idsRed.length()-1);
										}
									}
									e = new Ebene(e.getId(),
													e.getName(),
													prosaNeu!=null?prosaNeu.getId():0,
													time,
													( (!grpDez2 && !redakteur) || alterRedkZustand==Ebene.ZUSTAND_UNBEARBEITET ) ? Ebene.ZUSTAND_UNBEARBEITET : Ebene.ZUSTAND_GEAENDERT,
													idsVer,
													idsRed,
													idsUnter,
													idsFeld);
									ebenenRepository.saveEbene(e);
								}
								if(request.getParameter("speichernundabschl") != null) { // Readaktionszustand ändern
									int neuerRedakZustand = alterRedkZustand;
									if(neuerRedakZustand==Ebene.ZUSTAND_UNBEARBEITET) {
										neuerRedakZustand = Ebene.ZUSTAND_GEAENDERT;
									}
									if(!changed) {
										if((redakteur && grpDez2) ||
												(neuerRedakZustand==Ebene.ZUSTAND_AKZEPTIERT_REDAKT && grpDez2) ||
												(neuerRedakZustand==Ebene.ZUSTAND_AKZEPTIERT_DEZ2 && redakteur)) {
											neuerRedakZustand = Ebene.ZUSTAND_AKZEPTIERT_BEIDE;
										} else if(neuerRedakZustand==Ebene.ZUSTAND_GEAENDERT && grpDez2) {
											neuerRedakZustand = Ebene.ZUSTAND_AKZEPTIERT_DEZ2;
										} else if(neuerRedakZustand==Ebene.ZUSTAND_GEAENDERT && redakteur) {
											neuerRedakZustand = Ebene.ZUSTAND_AKZEPTIERT_REDAKT;
										}
									} else { // geändert
										if(grpDez2 && redakteur) {
											neuerRedakZustand = Ebene.ZUSTAND_AKZEPTIERT_BEIDE;
										} else if(grpDez2) {
											neuerRedakZustand = Ebene.ZUSTAND_AKZEPTIERT_DEZ2;
										} else if(redakteur) {
											neuerRedakZustand = Ebene.ZUSTAND_AKZEPTIERT_REDAKT;
										}
									}
									if(neuerRedakZustand != e.getRedaktionszustand()) {
										e.setRedaktionszustand(neuerRedakZustand);
									}
								}
								response.sendRedirect("Vorschau?ebenenId="+e.getId()+"&ebenenVer="+e.getErstellungszeit());
							} else if(request.getParameter("abbrechen") != null) { // Abbrechen
								response.sendRedirect("Vorschau?ebenenId="+e.getId()+"&ebenenVer="+e.getErstellungszeit());
							} else { // Keine Änderung nur Anzeigen
								request.setAttribute("ebene", e);
								request.setAttribute("tabsController", "Bearbeiten"); // um die Tabs richtig anzuzeigen
								RequestDispatcher view;
								view = request.getRequestDispatcher("OrgaBearbeitenForm.jsp");
								view.forward(request, response);
							}
						} else { // nicht Verantwortlicher der Ebene
							response.sendRedirect("Fehler?fehler=Sie haben keine Berechtigung die Ebene \""+ e.getName() +"\" zu bearbeiten.&weiterleitung=Vorschau?ebenenId="+e.getId());
						}
					} else { // nicht in der Gruppe
						response.sendRedirect("Fehler?fehler=Sie haben keine Berechtigung die Ebene \""+ e.getName() +"\" zu bearbeiten.&weiterleitung=Vorschau?ebenenId="+e.getId());
					}
				} else { // Ebene nicht gefunden
					String weiterleitung = request.getHeader("referer");
					if(weiterleitung == null) {
						weiterleitung = "AufgabenListe";
					} else {
						if(weiterleitung.lastIndexOf('/') != -1) {
							weiterleitung = weiterleitung.substring(weiterleitung.lastIndexOf('/'), weiterleitung.length());
						}
					}
					response.sendRedirect("Fehler?weiterleitung=" + weiterleitung + "&fehler=Die Ebene konnte nicht gefunden werden.");
				}
			} catch (ClassNotFoundException e1) {
				new helper.Logging("Fehler F092",e.toString(), benutzerRepository.getBenutzerNachEmail((String) request.getSession().getAttribute("email")), (byte)1);
				response.sendRedirect("Fehler?weiterleitung=Bearbeiten&fehler=Es konnte nicht auf die Datenbank zugegriffen werden! Bitte versuchen Sie es erneut oder kontaktieren Sie einen Administrator. (F092)");
			} catch (SQLException e1) {
				new helper.Logging("Fehler F093",e.toString(), benutzerRepository.getBenutzerNachEmail((String) request.getSession().getAttribute("email")), (byte)1);
				response.sendRedirect("Fehler?weiterleitung=Bearbeiten&fehler=Es konnte nicht auf die Datenbank zugegriffen werden! Bitte versuchen Sie es erneut oder kontaktieren Sie einen Administrator. (F093)");
			}
		}
	}
	
	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}

}
